#ifndef SM2_KEYEX_H
#define SM2_KEYEX_H

#include <stddef.h>
#include <gmssl/sm2.h> // 直接使用GmSSL提供的SM2

#define SM2_MAX_COORDINATE_LEN 32 // 新增宏定义

// 重新定义SM2密钥对结构
typedef struct
{
    SM2_KEY key;         // 使用GmSSL的SM2_KEY
    int has_private_key; // 标记是否包含私钥
} sm2_key_pair_t;

// 密钥交换消息结构
typedef struct
{
    unsigned char public_key_x[SM2_MAX_COORDINATE_LEN]; // 使用宏
    unsigned char public_key_y[SM2_MAX_COORDINATE_LEN]; // 使用宏
} key_exchange_t;

// 生成SM2密钥对
int sm2_generate_key_pair(sm2_key_pair_t *key_pair);

// 根据私钥创建完整密钥对（同时包含公钥）
int sm2_create_key_pair_from_private_key(sm2_key_pair_t *key_pair,
                                         const unsigned char *private_key,
                                         size_t private_key_len);

// 获取SM2公钥坐标值（用于通信）
int sm2_get_public_key_coords(const sm2_key_pair_t *key_pair,
                              unsigned char *pub_x, size_t pub_x_len,
                              unsigned char *pub_y, size_t pub_y_len);

// 基于SM2密钥对和对方公钥派生共享密钥
int sm2_derive_shared_key(const sm2_key_pair_t *local_key_pair,
                          const unsigned char *peer_pub_x, size_t peer_pub_x_len,
                          const unsigned char *peer_pub_y, size_t peer_pub_y_len,
                          unsigned char *shared_key, size_t shared_key_len);

// 释放SM2密钥对资源
void sm2_free_key_pair(sm2_key_pair_t *key_pair);

// SM2加密密钥
int sm2_encrypt_key(const unsigned char *plaintext, size_t plaintext_len,
                    const unsigned char *peer_pub_x, size_t peer_pub_x_len,
                    const unsigned char *peer_pub_y, size_t peer_pub_y_len,
                    unsigned char *ciphertext, size_t *ciphertext_len);

// SM2解密密钥
int sm2_decrypt_key(const unsigned char *ciphertext, size_t ciphertext_len,
                    const sm2_key_pair_t *key_pair,
                    unsigned char *plaintext, size_t *plaintext_len);

#endif /* SM2_KEYEX_H */